/* 
  依赖收集：建立 target 数据 - key 某个属性名 - cb 更新用户界面的回调 三者的映射关系
  
  WeakMap
  {
    target: Map
  }

  -->
  {
    target: {
      key: Set
    }
  }

  -->
  {
    target: {
      key: [effectFn1, effectFn2, ...] // effectFn1函数 --> 副作用函数 --> 里面有更新DOM的方法cb
    }
  }


  假设将来响应式数据 { name: 'jack', age: 18 }
  目的：建立响应式联系（数据-cb）

  targetMap -->
    weakMap{
      对象{ name: 'jack', age: 18 }: Map{
        name: Set[cb1, cb2, ...],
        age: Set[cb1, cb2, ...]
      }
    }
*/
const targetMap = new WeakMap();

function track(target, key) {
  // 存入映射关系
  const effectFn = effectStack[effectStack.length - 1]; // 拿出栈顶函数

  if (effectFn) {
    let depsMap = targetMap.get(target);

    if (!depsMap) {
      depsMap = new Map();
      targetMap.set(target, depsMap);
    }

    let deps = depsMap.get(key);
    if (!deps) {
      deps = new Set();
      depsMap.set(key, deps);
    }

    deps.add(effectFn);
  }
}
